{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 实验一：线性回归\n",
    "\n",
    "### 丁鑫钰   20221202514\n",
    "\n",
    "## 一、实验目的\n",
    "1. 了解线性回归模型的相关知识。\n",
    "2. 学习 `scikit-learn` 机器学习库的基本使用。\n",
    "\n",
    "## 二、实验环境\n",
    "- **系统**：Windows 10\n",
    "- **软件**：PyCharm\n",
    "- **需要安装的库**：\n",
    "  - Python 3.9\n",
    "  - NumPy\n",
    "  - Pandas\n",
    "  - Matplotlib\n",
    "  - scikit-learn (版本 >= 0.18)\n",
    "\n",
    "## 三、实验内容\n",
    "本实验使用的数据集为 `Folds5x2_pp.csv`，包含 9568 个样本数据，每个样本有 5 列，分别是：\n",
    "- AT（温度）\n",
    "- V（压力）\n",
    "- AP（湿度）\n",
    "- RH（压强）\n",
    "- PE（输出电力）\n",
    "\n",
    "我们不需要纠结于每项的具体意义。\n",
    "\n",
    "\n",
    "AT、V、AP、RH 这 4 列作为样本特征，PE 作为样本输出标签，我们试图通过如上数据学习到线性回归模型，也即： \n",
    "\n",
    "PE=θ0+θ1∗AT+θ2∗V+θ3∗AP+θ4∗RH \n",
    "\n",
    "也就是通过线性回归模型求的 θ0、θ1、θ2、θ3、θ4 这 5 个参数。 \n",
    " 如上样本数据按 3:1 随机划分成训练集和测试集，通过使用 scikit-learn 库\n",
    "中封装好的线性回归算法求出如上参数。 \n",
    "## 四、实验步骤 \n",
    "\n",
    "1. 环境搭建 \n",
    "Win10 系统中安装 python3.9，然后使用 pip 安装所需要的各个库。 \n",
    "\n",
    "命令如下：\n",
    "\n",
    "pip install 库名 \n",
    "\n",
    "2. 数据预处理 \n",
    "\n",
    "编写getTrainSetAndTestSet()函数，对数据集Folds5x2_pp.csv进行处理，按3:1的比例划分为训练集和测试集，AT、V、AP、RH这4列作为样本特征，PE作为样本输出标签。 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def getTrainSetAndTestSet(DataPath):\n",
    "    data = pd.read_csv(DataPath)  # 读取CSV文件\n",
    "    X = data[['AT', 'V', 'AP', 'RH']]  # 选取AT, V, AP, RH作为特征\n",
    "    y = data[['PE']]  # 选取PE作为标签\n",
    "    X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)  # 随机划分训练集和测试集，默认25%作为测试集\n",
    "    print(\"训练集特征维度:\", X_train.shape)\n",
    "    print(\"训练集标签维度:\", y_train.shape)\n",
    "    print(\"测试集特征维度:\", X_test.shape)\n",
    "    print(\"测试集标签维度:\", y_test.shape)\n",
    "    return X_train, X_test, y_train, y_test"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3. 训练 Linear Regression 模型 \n",
    "\n",
    "编写 TrainLinearRegression ()函数，首先建立好一个未训练的LinearRegression()模型，然后，将训练样本传给模型进行训练。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def TrainLinearRegression(X_train, y_train):\n",
    "    linreg = LinearRegression()  # 创建线性回归模型\n",
    "    linreg.fit(X_train, y_train)  # 使用训练集数据训练模型\n",
    "    print(\"线性回归截距:\", linreg.intercept_)\n",
    "    print(\"线性回归系数:\", linreg.coef_)\n",
    "    return linreg"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "4. 使用测试集评估模型性能 \n",
    "\n",
    "分别计算测试集真实值和预测值的均方误差和均方根误差，来评估模型性能。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def EvaluationModel(linreg, X_test, y_test):\n",
    "    y_pred = linreg.predict(X_test)  # 使用模型预测测试集\n",
    "    mse = np.mean((y_pred - y_test) ** 2)  # 计算均方误差\n",
    "    print(\"均方误差MSE:\", mse)\n",
    "    rmse = np.sqrt(mse)  # 计算均方根误差\n",
    "    print(\"均方根误差RMSE:\", rmse)\n",
    "    return y_pred"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "5. 可视化 \n",
    "\n",
    "利用 matplotlib 库绘制预测值和实际值之前的关系，预测值和实际值越接近黑色虚线，说明预测值和实际值的误差越小。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def Visualization(y_test, y_pred):\n",
    "    fig, ax = plt.subplots()  # 创建图形和轴\n",
    "    ax.scatter(y_test, y_pred)  # 绘制散点图\n",
    "    ax.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'k--', lw=5)  # 绘制对角线\n",
    "    ax.set_xlabel(\"Measured\")  # 设置x轴标签\n",
    "    ax.set_ylabel(\"Predicted\")  # 设置y轴标签\n",
    "    plt.show()  # 显示图形"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "6. 完整代码如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练集特征维度: (7176, 4)\n",
      "训练集标签维度: (7176, 1)\n",
      "测试集特征维度: (2392, 4)\n",
      "测试集标签维度: (2392, 1)\n",
      "线性回归截距: [447.06297099]\n",
      "线性回归系数: [[-1.97376045 -0.23229086  0.0693515  -0.15806957]]\n",
      "均方误差MSE: 20.080401202073894\n",
      "均方根误差RMSE: 4.481116066570235\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.linear_model import LinearRegression\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "def getTrainSetAndTestSet(DataPath):\n",
    "    data = pd.read_csv(DataPath)  # 读取CSV文件\n",
    "    X = data[['AT', 'V', 'AP', 'RH']]  # 选取AT, V, AP, RH作为特征\n",
    "    y = data[['PE']]  # 选取PE作为标签\n",
    "    X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)  # 随机划分训练集和测试集，默认25%作为测试集\n",
    "    print(\"训练集特征维度:\", X_train.shape)\n",
    "    print(\"训练集标签维度:\", y_train.shape)\n",
    "    print(\"测试集特征维度:\", X_test.shape)\n",
    "    print(\"测试集标签维度:\", y_test.shape)\n",
    "    return X_train, X_test, y_train, y_test\n",
    "\n",
    "def TrainLinearRegression(X_train, y_train):\n",
    "    linreg = LinearRegression()  # 创建线性回归模型\n",
    "    linreg.fit(X_train, y_train)  # 使用训练集数据训练模型\n",
    "    print(\"线性回归截距:\", linreg.intercept_)\n",
    "    print(\"线性回归系数:\", linreg.coef_)\n",
    "    return linreg\n",
    "\n",
    "def EvaluationModel(linreg, X_test, y_test):\n",
    "    y_pred = linreg.predict(X_test)  # 使用模型预测测试集\n",
    "    mse = np.mean((y_pred - y_test) ** 2)  # 计算均方误差\n",
    "    print(\"均方误差MSE:\", mse)\n",
    "    rmse = np.sqrt(mse)  # 计算均方根误差\n",
    "    print(\"均方根误差RMSE:\", rmse)\n",
    "    return y_pred\n",
    "\n",
    "def Visualization(y_test, y_pred):\n",
    "    fig, ax = plt.subplots()  # 创建图形和轴\n",
    "    ax.scatter(y_test, y_pred)  # 绘制散点图\n",
    "    ax.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'k--', lw=5)  # 绘制对角线\n",
    "    ax.set_xlabel(\"Measured\")  # 设置x轴标签\n",
    "    ax.set_ylabel(\"Predicted\")  # 设置y轴标签\n",
    "    display(fig)  # 使用display函数确保图形被正确显示\n",
    "    plt.close(fig)  # 关闭图形以避免重复显示\n",
    "\n",
    "if __name__ == \"__main__\":\n",
    "    data_path = \"Folds5x2_pp.csv\"  # 数据集路径\n",
    "    X_train, X_test, y_train, y_test = getTrainSetAndTestSet(data_path)  # 获取训练集和测试集\n",
    "    linreg_model = TrainLinearRegression(X_train, y_train)  # 训练线性回归模型\n",
    "    y_pred = EvaluationModel(linreg_model, X_test, y_test)  # 评估模型性能\n",
    "    Visualization(y_test, y_pred)  # 可视化结果"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
